{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# 示例：剩余使用寿命预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "is_executing": true,
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "from fastphm.data import Dataset\n",
    "from fastphm.data.FeatureExtractor import FeatureExtractor\n",
    "from fastphm.data.loader.bearing.XJTULoader import XJTULoader\n",
    "from fastphm.data.labeler.BearingRulLabeler import BearingRulLabeler\n",
    "from fastphm.data.processor.RMSProcessor import RMSProcessor\n",
    "from fastphm.metric.end2end.PHM2008Score import PHM2008Score\n",
    "from fastphm.metric.end2end.PHM2012Score import PHM2012Score\n",
    "from fastphm.metric.end2end.PercentError import PercentError\n",
    "from fastphm.data.stage.BearingStageCalculator import BearingStageCalculator\n",
    "from fastphm.data.stage.fpt.ThreeSigmaFPTCalculator import ThreeSigmaFPTCalculator\n",
    "from fastphm.model.pytorch.base.BaseTester import BaseTester\n",
    "from fastphm.model.pytorch.base.BaseTrainer import BaseTrainer\n",
    "from fastphm.model.pytorch.basic.CNN import CNN\n",
    "from fastphm.metric.Evaluator import Evaluator\n",
    "from fastphm.metric.end2end.MAE import MAE\n",
    "from fastphm.metric.end2end.MSE import MSE\n",
    "from fastphm.metric.end2end.RMSE import RMSE\n",
    "from fastphm.model.pytorch.callback.CheckGradientsCallback import CheckGradientsCallback\n",
    "from fastphm.model.pytorch.callback.EarlyStoppingCallback import EarlyStoppingCallback\n",
    "from fastphm.model.pytorch.callback.TensorBoardCallback import TensorBoardCallback\n",
    "from fastphm.util.Plotter import Plotter"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 定义 数据加载器、特征提取器、fpt计算器、eol计算器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[DEBUG   14:20:12]  \n",
      "[DataLoader]  Root directory: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\n",
      "\t✓ Bearing1_1, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\35Hz12kN\\Bearing1_1\n",
      "\t✓ Bearing1_2, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\35Hz12kN\\Bearing1_2\n",
      "\t✓ Bearing1_3, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\35Hz12kN\\Bearing1_3\n",
      "\t✓ Bearing1_4, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\35Hz12kN\\Bearing1_4\n",
      "\t✓ Bearing1_5, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\35Hz12kN\\Bearing1_5\n",
      "\t✓ Bearing2_1, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\37.5Hz11kN\\Bearing2_1\n",
      "\t✓ Bearing2_2, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\37.5Hz11kN\\Bearing2_2\n",
      "\t✓ Bearing2_3, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\37.5Hz11kN\\Bearing2_3\n",
      "\t✓ Bearing2_4, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\37.5Hz11kN\\Bearing2_4\n",
      "\t✓ Bearing2_5, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\37.5Hz11kN\\Bearing2_5\n",
      "\t✓ Bearing3_1, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\40Hz10kN\\Bearing3_1\n",
      "\t✓ Bearing3_2, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\40Hz10kN\\Bearing3_2\n",
      "\t✓ Bearing3_3, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\40Hz10kN\\Bearing3_3\n",
      "\t✓ Bearing3_4, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\40Hz10kN\\Bearing3_4\n",
      "\t✓ Bearing3_5, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\40Hz10kN\\Bearing3_5\n"
     ]
    }
   ],
   "source": [
    "data_loader = XJTULoader('D:\\\\data\\\\dataset\\\\XJTU-SY_Bearing_Datasets')\n",
    "feature_extractor = FeatureExtractor(RMSProcessor(data_loader.continuum))\n",
    "fpt_calculator = ThreeSigmaFPTCalculator()\n",
    "stage_calculator = BearingStageCalculator(data_loader.continuum, fpt_calculator)\n",
    "Plotter.DPI = 80"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 获取原始数据、特征数据、阶段数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[INFO    14:20:12]  [DataLoader]  -> Loading data entity: Bearing1_3\n",
      "[INFO    14:20:15]  [DataLoader]  ✓ Successfully loaded: Bearing1_3\n"
     ]
    }
   ],
   "source": [
    "bearing = data_loader(\"Bearing1_3\", 'Horizontal Vibration')\n",
    "feature_extractor(bearing)\n",
    "stage_calculator(bearing)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 生成训练数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "generator = BearingRulLabeler(2048, is_from_fpt=False, is_rectified=True)\n",
    "data_set = generator(bearing)\n",
    "train_set, test_set = data_set.split_by_ratio(0.7)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 配置训练算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_config = {\n",
    "    'device': torch.device('cuda' if torch.cuda.is_available() else 'cpu'),\n",
    "    'dtype': torch.float32,\n",
    "    'epochs': 20,\n",
    "    'batch_size': 256,\n",
    "    'lr': 0.01,\n",
    "    'weight_decay': 0.0,\n",
    "}\n",
    "trainer = BaseTrainer(train_config)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 定义模型并训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "is_executing": true,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[INFO    14:20:15]  \n",
      "[Trainer]  Start training by BaseTrainer:\n",
      "\ttraining set: Bearing1_3\n",
      "\tdevice: cuda\n",
      "\tdtype: torch.float32\n",
      "\tepochs: 20\n",
      "\tbatch_size: 256\n",
      "\tlr: 0.01\n",
      "\tweight_decay: 0.0\n",
      "\tcallbacks: []\n",
      "\tcriterion: MSELoss()\n",
      "\toptimizer: Adam\n",
      "[INFO    14:20:16]  [BaseTrainer]  Epoch [1/20], MSELoss:0.9514\n",
      "[INFO    14:20:16]  [BaseTrainer]  Epoch [2/20], MSELoss:0.1000\n",
      "[INFO    14:20:16]  [BaseTrainer]  Epoch [3/20], MSELoss:0.0201\n",
      "[INFO    14:20:16]  [BaseTrainer]  Epoch [4/20], MSELoss:0.0092\n",
      "[INFO    14:20:16]  [BaseTrainer]  Epoch [5/20], MSELoss:0.0040\n",
      "[INFO    14:20:16]  [BaseTrainer]  Epoch [6/20], MSELoss:0.0025\n",
      "[INFO    14:20:16]  [BaseTrainer]  Epoch [7/20], MSELoss:0.0021\n",
      "[INFO    14:20:16]  [BaseTrainer]  Epoch [8/20], MSELoss:0.0019\n",
      "[INFO    14:20:16]  [BaseTrainer]  Epoch [9/20], MSELoss:0.0016\n",
      "[INFO    14:20:16]  [BaseTrainer]  Epoch [10/20], MSELoss:0.0015\n",
      "[INFO    14:20:16]  [BaseTrainer]  Epoch [11/20], MSELoss:0.0014\n",
      "[INFO    14:20:16]  [BaseTrainer]  Epoch [12/20], MSELoss:0.0013\n",
      "[INFO    14:20:16]  [BaseTrainer]  Epoch [13/20], MSELoss:0.0012\n",
      "[INFO    14:20:16]  [BaseTrainer]  Epoch [14/20], MSELoss:0.0012\n",
      "[INFO    14:20:16]  [BaseTrainer]  Epoch [15/20], MSELoss:0.0012\n",
      "[INFO    14:20:16]  [BaseTrainer]  Epoch [16/20], MSELoss:0.0012\n",
      "[INFO    14:20:16]  [BaseTrainer]  Epoch [17/20], MSELoss:0.0013\n",
      "[INFO    14:20:16]  [BaseTrainer]  Epoch [18/20], MSELoss:0.0012\n",
      "[INFO    14:20:16]  [BaseTrainer]  Epoch [19/20], MSELoss:0.0013\n",
      "[INFO    14:20:16]  [BaseTrainer]  Epoch [20/20], MSELoss:0.0010\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x280 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model = CNN(2048, 1)\n",
    "losses = trainer.train(model, train_set)\n",
    "Plotter.loss(losses)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 做出预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "is_executing": true,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x280 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'default'"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tester = BaseTester()\n",
    "result = tester.test(model, test_set)\n",
    "Plotter.rul_end2end(test_set, result, label_x='Time (min)', label_y='Relative RUL')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 预测结果评价"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "pycharm": {
     "is_executing": true,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[INFO    14:20:17]  \n",
      "[Evaluator]  Performance Evaluation:\n",
      "               MAE     MSE    RMSE PercentError PHM2012Score PHM2008Score\n",
      "Bearing1_3  0.0277  0.0012  0.0348       -2.23%       0.6378       2.0030\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>MAE</th>\n",
       "      <th>MSE</th>\n",
       "      <th>RMSE</th>\n",
       "      <th>PercentError</th>\n",
       "      <th>PHM2012Score</th>\n",
       "      <th>PHM2008Score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Bearing1_3</th>\n",
       "      <td>0.0277</td>\n",
       "      <td>0.0012</td>\n",
       "      <td>0.0348</td>\n",
       "      <td>-2.23%</td>\n",
       "      <td>0.6378</td>\n",
       "      <td>2.0030</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               MAE     MSE    RMSE PercentError PHM2012Score PHM2008Score\n",
       "Bearing1_3  0.0277  0.0012  0.0348       -2.23%       0.6378       2.0030"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "evaluator = Evaluator()\n",
    "evaluator.add(MAE(), MSE(), RMSE(), PercentError(), PHM2012Score(), PHM2008Score())\n",
    "evaluator(test_set, result)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
